#include <sys_head.h>
#include "agr.h"
#include "pthread.h"

// argv[1] IP地址
// argv[2] 端口号

void Server(int Sock_fd);

// 读写线程
void *r_pthread(void *arg_fd);
void *w_pthread(void *arg_fd);

int main(int argc, char const *argv[])
{
    // 判断命令行参数
    if (3 != argc)
    {
        printf("参数错误:%s ip port\n", argv[0]);
        return -1;
    }

    //  1、创建套接字
    int Sock_fd = socket(AF_INET, SOCK_STREAM, 0);
    if (-1 == Sock_fd)
    {
        ERRLOG("socket erron");
        return -1;
    }
    //  2、填充服务器网络信息结构体
    struct sockaddr_in Sock_addr;
    Sock_addr.sin_family = AF_INET;                 // 选择 IPV4
    Sock_addr.sin_port = htons(atoi(argv[2]));      // 给定端口 // atoi 将字符串 转换成数字
    Sock_addr.sin_addr.s_addr = inet_addr(argv[1]); // IP地址

    socklen_t Sock_size = sizeof(Sock_addr);

    //  3、将套接字与服务器的网络信息结构体绑定
    if (-1 == bind(Sock_fd, (struct sockaddr *)&Sock_addr, Sock_size))
    {
        ERRLOG("bind err");
        return -1;
    }

    //  4、将套接字设置城 监听状态

    if (-1 == listen(Sock_fd, 5))
    {
        ERRLOG("Sock_fd err");
        return -1;
    }
    //  5、阻塞等待客户端连接 accept

    int acc_fd = accept(Sock_fd, NULL, NULL);
    if (-1 == acc_fd)
    {
        ERRLOG("accept err");
        return -1;
    }

    //  6、数据收发 write read
    Server(acc_fd);

    //  7、关闭套接字  close
    close(acc_fd);
    close(Sock_fd);
    return 0;
}

void Server(int Sock_fd)
{
    // 开始进行数据收发
    pthread_t w_tid;
    pthread_t r_tid;

    pthread_create(&r_tid, NULL, r_pthread, (void *)&Sock_fd);
    pthread_create(&w_tid, NULL, w_pthread, (void *)&Sock_fd);
    

    pthread_join(r_tid, NULL);
    pthread_join(w_tid, NULL);
}


